package org.huangrui.spark.scala.core.rdd.dep

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
 *
 * @Author hr
 * @Create 2024-10-19 15:40
 */
object Spark08_Part {
  def main(args: Array[String]): Unit = {
    val sparConf = new SparkConf().setMaster("local[*]").setAppName("WordCount")
    val sc = new SparkContext(sparConf)

    val lines: RDD[String] = sc.makeRDD(Array("hello world", "hello atguigu", "atguigu", "hahah"),3)
    val words: RDD[String] = lines.flatMap(_.split(" "))
    val wordToOne = words.map(word => {
      println("***********************")
      (word, 1)
    })
    // TODO reduceByKey方法需要传递两个参数
    //     1. 第一个参数表示数据分区的规则，参数可以不用传递，使用时，会使用默认值（默认分区规则:HashPartitioner）
    //        HashPartitioner中有getPartition一个方法
    //              getPartition需要传递一个参数Key, 然后方法需要返回一个值，表示分区编号，分区编号从0开始。
    //                 逻辑： 分区编号 <=  Key.hashCode % partNum (哈希取余)
    //     2. 第二个参数表示数据聚合的逻辑
    val wordToSum: RDD[(String, Int)] = wordToOne.reduceByKey(_ + _)
    val groupByKey = wordToOne.groupByKey()
    val sortByKey = wordToOne.sortByKey()

    // TODO 数据分区的规则
    //      计算后数据所在的分区是通过Spark的内部计算（分区）完成,尽可能让数据均衡（散列）一些，但是不是平均分。

    wordToSum.saveAsTextFile("output")
    sc.stop()
  }
}
